home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / misc / volume27 / psf3 / part06 < prev    next >
Encoding:
Text File  |  1992-01-20  |  50.9 KB  |  1,722 lines

  1. Newsgroups: comp.sources.misc
  2. From: tony@ajfcal.cuc.ab.ca (Tony Field)
  3. Subject:  v27i097:  psf3 - Postscript print filter system, v3, Part06/09
  4. Message-ID: <1992Jan21.013351.11634@sparky.imd.sterling.com>
  5. X-Md4-Signature: ca5cdb4bb5c66ea7608431b8a4949264
  6. Date: Tue, 21 Jan 1992 01:33:51 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: tony@ajfcal.cuc.ab.ca (Tony Field)
  10. Posting-number: Volume 27, Issue 97
  11. Archive-name: psf3/part06
  12. Environment: ISC, SUNOS, SYSVR3, DOS
  13. Supersedes: psf2: Volume 12, Issue 4-9
  14.  
  15. #! /bin/sh
  16. # This is a shell archive.  Remove anything before this line, then unpack
  17. # it by saving it into a file and typing "sh file".  To overwrite existing
  18. # files, type "sh file -c".  You can also feed this as standard input via
  19. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  20. # will see the following message at the end:
  21. #        "End of archive 6 (of 9)."
  22. # Contents:  Install.def Install.dos Install.unix Makefile table.c
  23. # Wrapped by ajf@trifid on Sat Jan 18 22:55:50 1992
  24. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  25. if test -f 'Install.def' -a "${1}" != "-c" ; then 
  26.   echo shar: Will not clobber existing file \"'Install.def'\"
  27. else
  28. echo shar: Extracting \"'Install.def'\" \(8808 characters\)
  29. sed "s/^X//" >'Install.def' <<'END_OF_FILE'
  30. X        CONFIGURE PSF FOR AN "UNKNOWN" PRINTER
  31. X
  32. X    Psf likes to have a "printer definition file" (usually
  33. X    psfprint.def) to describe the fonts, imageable area, and paper
  34. X    tray information needed by psf.  If the .def information
  35. X    is an accurate description of your printer, psf can do a
  36. X    good job of page rotation, scaling, and double sided printing.
  37. X    
  38. X    Two way are available to create a .def for an unknown printer:
  39. X
  40. X
  41. X    GET A COPY OF YOUR PRINTER'S .PPD FILE
  42. X    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  43. X    If you can get a copy of your printer's ".ppd" file from the
  44. X    Adobe server by email or from the manufacturer, you can use the
  45. X    "table" programme to convert the .ppd information into a .def
  46. X    format required by psf. The command:
  47. X
  48. X        table printer.ppd /usr/tmp
  49. X
  50. X    will read your file "printer.ppd" and create a file
  51. X    /usr/tmp/printer.def. Copy this "printer.def" file to your psf
  52. X    directory:
  53. X
  54. X        cp /usr/tmp/printer.def psfprint.def
  55. X
  56. X    Also, you should probably copy this file into ./defs for future
  57. X    reference.
  58. X
  59. X
  60. X    BUILD A .DEF FILE MANUALLY
  61. X    ^^^^^^^^^^^^^^^^^^^^^^^^^^
  62. X    If you have a printer that is not described when you execute
  63. X
  64. X        selectdef ./defs/*.def
  65. X
  66. X    all is not lost. 
  67. X
  68. X    Here is a summary of the steps:
  69. X    
  70. X        1. copy getsizes.ps to your printer. This determines
  71. X           the page sizes and imageable area on your printer.
  72. X        
  73. X        2. copy ./defs/n890_470.def to psfprint.def.
  74. X        
  75. X        3. edit psfprint.def to reflect the imageable area
  76. X           and font name information for your printer.
  77. X        
  78. X        4. all done - continue with "make installbsd"
  79. X           or "make installsysv" as described in "Install.unix".
  80. X
  81. X    In more detail:
  82. X    
  83. X    Generally, your printer is closely approximated by one of the
  84. X    known printers. Guess at which one that might be! The best
  85. X    guessing method is to look at your printer characteristics and
  86. X    compare them to the various files in the ./defs directory :-)
  87. X
  88. X    If you are really lost, then maybe psf's default printer (a NEC
  89. X    LC890) is close enough to yours and you don't really need a
  90. X    psfprint.def description file.
  91. X
  92. X    With a little work, you can manually construct your own
  93. X    psfprint.def. The basic items that you need to know are:
  94. X
  95. X        1. Which paper sizes can your printer handle
  96. X           such as a4, letter, legal, etc?  This can be
  97. X           generated by "getsizes.ps".
  98. X           
  99. X           What is the postscript command needed to select
  100. X           the paper size? Check you reference manual.
  101. X
  102. X        2. What is the imageable area of each paper size?
  103. X           Each paper size has a specific x-y min and max that
  104. X           can be addressed. The postscript programme
  105. X           "getsizes.ps" can give you the imageable areas
  106. X           for your printer.
  107. X
  108. X        3. Which fonts are available? Usually, you can
  109. X           have the printer display all of it's known
  110. X           fonts when you print the printers "test page".
  111. X           Maybe it is in your manual.
  112. X
  113. X        4. How many paper trays are on your system and how
  114. X           do you select them?  This is usually in your
  115. X           printer's technical reference manual.
  116. X
  117. X    Determine the various available fonts from your printer's manual
  118. X    or the built-in test page.
  119. X
  120. X    Send the postscript programme "getsizes.ps" to your printer.
  121. X    It will attempt to display the imageable area for all paper
  122. X    sizes in your printer.  Copy with a command like:
  123. X
  124. X        1.   lp getsizes.ps
  125. X        
  126. X        2.   cat getsizes.ps > /dev/lp
  127. X        
  128. X        3.   or what ever, just get it to the printer.
  129. X
  130. X    The resulting printed sizes are needed when you construct your
  131. X    own psfprint.def file. The numbers that display are exactly
  132. X    those required when you describe the "page dimensions" in the
  133. X    .def file.
  134. X
  135. X    Now copy a sample ".def" file to your working copy. Try to choose
  136. X    one that might be an approximation to your own printer:
  137. X
  138. X        cp ./defs/n890_470.def psfprint.def
  139. X    
  140. X    Using the example commented sample "def" file below, edit your
  141. X    psfprint.def file to use your printer's appropriate information
  142. X    for imageable area, font names and other parameters. Hopefully,
  143. X    it is clear enough and you can just follow your intuition!
  144. X
  145. X=========================================================================        
  146. X
  147. X    This is a commented sample of a printer "def" file.
  148. X
  149. X    You will need a list of available fonts and the printed results
  150. X    from "getsizes.ps".  Select a .def that is a "reasonable
  151. X    approximation" to your printer.  If you cannot find one,
  152. X    use ./defs/n890_470.def.
  153. X
  154. X    Look at other files in the ./defs directory to see how things
  155. X    should be constructed. For example, if you have only one paper
  156. X    tray, then you don't need "*slots" entries. i.e. your resulting
  157. X    file would look like:
  158. X        ...
  159. X        *slots 0
  160. X        *eof
  161. X
  162. X    The various sections of the file are separated by a line
  163. X    starting with "*". The first section describes the page sizes
  164. X    known to the printer.
  165. X
  166. X    There should not be any blank lines in your resulting .def
  167. X    file.  Line format must be exactly right. No edit checks
  168. X    are performed by psf and friends.
  169. X--...--
  170. X
  171. X# comments at beginning of file
  172. X*psflpd    <link> <opt> <opt> <comment>     <-- option marker for lpd use only
  173. X                        (see Install.lpd for details)
  174. X                        This is not present for use with
  175. X                        lp/lpsched. Multiple lines
  176. X                        may be present.
  177. X
  178. X*printer                <-- marker: printer definition
  179. XNEC LC-890 v47.0 (modified)             <-- printer name for selectdef
  180. X
  181. X*paper 4                <-- marker and count of paper
  182. X                        types.
  183. X                        
  184. X                        next comes each paper size
  185. X                        available in your printer
  186. X                        in groups of three lines.
  187. X
  188. XLetter                                  <-- The name use by psf when the
  189. X                        user selects a size with -g:
  190. X                            e.g.  psf -g letter my.fil
  191. X                              ^^^^^^^^^
  192. Xstatusdict begin lettertray end         <-- actual postscript to select size
  193. X                        code needed to select this
  194. X                        page size. If there is only
  195. X                        one paper tray, this is
  196. X                        usually a single word like
  197. X                        "letter" as in the file
  198. X                        ./defs/apple380.def or for
  199. X                        the Varityper printers.
  200. X                        Examine a few of these files
  201. X                        for the syntax of this line.
  202. X
  203. X                        the following is the imageable
  204. X                        area for the paper size.  Use
  205. X                        the numbers that are printed
  206. X                        when you copy getsizes.ps or
  207. X                        psizes.ps to your printer.
  208. X  612   792    18    15   599   776
  209. X   |     |      |     |    |     +--------- upper right y-coord (points)
  210. X   |     |      |     |    +--------------- upper right x-coord
  211. X   |     |      |     +-------------------- lower left y-coord
  212. X   |     |      +-------------------------- lower left x-coord
  213. X   |     +--------------------------------- total page height in points
  214. X   +--------------------------------------- total page width in points
  215. X                        (at least one blank must 
  216. X                         separate the numbers)
  217. X
  218. X                        The first two numbers are
  219. X                        manually calculated in points
  220. X                        such that:
  221. X                        
  222. X                          points = 72 * inches
  223. X                        
  224. X                        for example, a 8.5 inch wide
  225. X                        page would be 612 points wide.
  226. X
  227. XLegal                                   <-+-- the above is repeated for
  228. Xstatusdict begin legaltray end            |   each page size known
  229. X  612  1008    18    19   593   990     <-+-- to the printer
  230. XA4
  231. Xstatusdict begin a4tray end
  232. X  595   842    10     8   585   813
  233. XB5
  234. Xstatusdict begin b5tray end
  235. X  516   729    18     7   482   702
  236. X
  237. X*order 1                <-- marker and count for stacking order
  238. XNormal                    <-- either "Normal" if the pages are
  239. X                        stacked face down, or
  240. X                        "Reverse" if the pages are
  241. X                        stacked face up.
  242. X                        
  243. X*fonts 10                               <-- marker and count for fonts
  244. XAvantGarde-Book                         <-- real font names in your printer
  245. XBookman-Light
  246. XCourier                      
  247. XHelvetica                    fonts available on your printer
  248. XHelvetica-Narrow                are printed on it's test page
  249. XNewCenturySchlbk-Roman
  250. XPalatino-Roman                    only the "base font name", not
  251. XGaramond-Light                    the "italic" or "Bold" names
  252. XTimes-Roman                        are in this list.
  253. XZapfChancery-MediumItalic
  254. X
  255. X                        If you wish, modify psf.c
  256. X                        (array *fonts[NFONTS]) for
  257. X                        additional or different fonts
  258. X
  259. X*slots 2                                <-- marker and count for paper trays
  260. X
  261. X                        Some printers number the
  262. X                        paper trays starting from 0
  263. X                        rather than 1 - for example,
  264. X                        the Dataproducts or TI printers.
  265. X                        
  266. X                        If you have only one paper tray,
  267. X                        this section should be empty.
  268. X                     
  269. Xstatusdict begin 1 setpapertray end     <-- how to select first tray
  270. Xstatusdict begin 2 setpapertray end     <-- how to select second tray  etc..
  271. X*eof                                    <-- logical eof for printer definition
  272. X
  273. X%%PsfStart                <-- marker for language translation
  274. X%%fonX                        facilities.  See language.PSF.
  275. X%%translate                    This section is optional.
  276. X%%PsfEnd
  277. X%postscript source
  278. X--------------------------------------------------------------------------
  279. XTony Field:  tony@ajfcal.cuc.ab.ca
  280. END_OF_FILE
  281. if test 8808 -ne `wc -c <'Install.def'`; then
  282.     echo shar: \"'Install.def'\" unpacked with wrong size!
  283. fi
  284. # end of 'Install.def'
  285. fi
  286. if test -f 'Install.dos' -a "${1}" != "-c" ; then 
  287.   echo shar: Will not clobber existing file \"'Install.dos'\"
  288. else
  289. echo shar: Extracting \"'Install.dos'\" \(7837 characters\)
  290. sed "s/^X//" >'Install.dos' <<'END_OF_FILE'
  291. X            PSF (v3) on MSDOS
  292. X                        ^^^^^^^^^^^^^^^^^
  293. X   Pre-formatted documentation is available in the man/* directory.
  294. X   
  295. X   Modify the various options in the Makefile and/or psf.h.
  296. X
  297. X   Compile the sources with MSC 5.1 (depending on your version of make,
  298. X   utilities, cawf, etc). 
  299. X
  300. X   Sorry, no special setup for Turbo C! Since there is nothing "strange"
  301. X   about the code, it should compile without problem. 
  302. X   
  303. X   Source for getopt() is provided if your libraries do not have a copy.
  304. X
  305. X   Read "Install.unix" and "Install.def" for additional information, if
  306. X   desired.
  307. X
  308. X   Build with:
  309. X        make -f makefile.dos psf.exe
  310. X        make -f makefile.dos psfbs.exe
  311. X        make -f makefile.dos psfdoub,exe
  312. X        make -f makefile.dos selectdef.exe
  313. X        make -f makefile.dos printer
  314. X            (or execute the batch script "getprint"
  315. X             and proceed as described in the INSTALL
  316. X             section below)
  317. X        make -f makefile.dos doc      (if you have cawf)
  318. X        make -f makefile.dos installdos
  319. X
  320. X       usage:
  321. X        psf this.fil > prn
  322. X        psfnroff -man psf.1
  323. X
  324. X   If your version of make is incompatible with mine, you may have to
  325. X   edit "psf.h" for system defaults and use your own method of building
  326. X   the system using makefile.dos as a guide.
  327. X
  328. X   The provided Makefile.dos (and psfnroff.bat) assumes that you have
  329. X   "cawf" as an nroff replacement when you "make doc".  If "cawf" is
  330. X   not available, preformatted "*.doc" pages are provided.
  331. X
  332. X   INSTALL
  333. X   ^^^^^^^
  334. X       1. select a printer with:
  335. X   
  336. X           getprint
  337. X          or:
  338. X              selectde .\defs\*.def
  339. X          
  340. X          The various printer definitions are assumed to be in
  341. X          the ".\defs" directory.
  342. X       
  343. X       If your printer is not defined in the table of known
  344. X       printers, then choose the nearest approximation.
  345. X       
  346. X       If nothing is "close", then read "Install.def" to
  347. X       construct your own "psfprint.def" file.
  348. X       
  349. X       A "psfprint.def" printer definition file is created
  350. X       in the current directory.
  351. X       
  352. X       2. copy the "psfprint.def generated in (1) above
  353. X          to a "library" directory:
  354. X       
  355. X           copy psfprint.def c:\lib\psfprint.def
  356. X  
  357. X      3. Set the environment variable PSFLP to define the printer:
  358. X      
  359. X          set PSFLP=prn
  360. X          
  361. X         If this variable is not set, then psf prints to stdout.
  362. X  
  363. X      4. Set the environment variable PSFDEF to the location
  364. X         of the "psfprint.def" file created in (1) above:
  365. X         
  366. X             set PSFDEF=c:\lib\psfprint.def
  367. X        
  368. X      If this variable is not set, then "psfprint.def" is assumed to
  369. X      be in the directory specified in the makefile. If psfprint.def
  370. X      does not exist, then psf defaults to work like a NEC LC890.
  371. X
  372. X      5. Move the binaries and batch scripts to an appropriate
  373. X         directory:
  374. X         
  375. X             copy psf.exe c:\bin
  376. X             copy psfbs.exe c:\bin      --> optional
  377. X             copy psfdoub.exe c:\bin      --> optional
  378. X             copy psfnroff.bat c:\bin   --> optional
  379. X  
  380. X         Psfbs.exe and psfnroff.bat are needed only if nroff (cawf) 
  381. X         formatting is used.
  382. X
  383. X         Psfdoub.exe is needed only if double sided or reverse page
  384. X       order printing is used.
  385. X       
  386. X       If double sided printing is necessary on a regular basis,
  387. X       modify the sample batch file "psdouble.bat" to suit
  388. X       your requirements.
  389. X
  390. X       Selectde.exe is used only for printer selection, and is
  391. X       not usually copied to the binary working directory.
  392. X
  393. X      6. PSF can now be used: for example, print this "Install.dos"
  394. X         file with:
  395. X      
  396. X          psf Install.dos
  397. X
  398. X    7. Print the doc pages.  If the environment variable
  399. X       PSFLP is not set, you must redirect stdout to prn.
  400. X       If the PSFLP is set to 'prn', then the redirection
  401. X       to prn is not needed.
  402. X    
  403. X        psf -R2 -r3 -2 psf.doc > prn
  404. X        psf -R2 -r3 -2 psfbs.doc > prn
  405. X        psf -R2 -r3 -2 psfdoub.doc > prn
  406. X        psf -R2 -r3 -2 psfnroff.doc > prn
  407. X
  408. X       This format assumes letter size paper.  If other paper
  409. X       sizes are used, try (untested):
  410. X       
  411. X        psf -l63 -c80 -R2 -r3 -2 psf.doc > prn
  412. X        psf -l63 -c80 -R2 -r3 -2 psfbs.doc > prn
  413. X        psf -l63 -c80 -R2 -r3 -2 psfdoub.doc > prn
  414. X        psf -l63 -c80 -R2 -r3 -2 psfnroff.doc > prn
  415. X
  416. X    8. If psfnroff.bat is to be used, possibly change or remove
  417. X       the print device "> prn".  psfnroff.bat assumes that
  418. X       "cawf" is used instead of "nroff".
  419. X
  420. X    9. Verify that the imageable area of your printer actually
  421. X       corresponds to the printer definition that you selected during
  422. X       the install process. Send the postscript file "psizes.ps" (or
  423. X       getsizes.ps) to the line printer by some method:
  424. X
  425. X        copy psizes.ps prn
  426. X        -or-
  427. X        copy getsizes.ps prn
  428. X
  429. X       This programme prints the actual imageable area for each page
  430. X       size known to your printer.
  431. X
  432. X       The printed imageable area numbers should match the
  433. X       corresponding numbers in psfprint.def. If they do not, edit
  434. X       psfprint.def to use the printed numbers. (Even Adobe information
  435. X       does not necessarily reflect the real nature of your printer. My
  436. X       own Nec LC890 had a different letter imageable area than
  437. X       indicated by the original .ppd file from Adobe...).
  438. X
  439. X       Read "Install.def" if the editing process in not transparent!
  440. X
  441. X       Copy the new psfprint.def file to it's target location as
  442. X       set with "DEFFILE" in the Makefile.
  443. X
  444. X       10. Examine "Testfile". This file is an example of how escape
  445. X       seqeuences can be imbedded in a text file to allow direct font
  446. X       control within a text editor (See psf.1 for details).
  447. X       [[ This file should contain CTL/characters.  
  448. X          If this test file is not in proper format, read the
  449. X          notes in Install.unix to convert the necessary
  450. X          control characters ]]
  451. X
  452. X       After examining it,  do the following:
  453. X
  454. X        psf example > prn
  455. X    
  456. X       to see how font control can work in a text file.
  457. X
  458. X
  459. X     MAN PAGES
  460. X     ^^^^^^^^^
  461. X    The man pages are all the "man/*.1" files. These may be formatted
  462. X    with nroff or cawf. Man page installation must be done by hand.
  463. X    Pre-formatted man pages are in man/*.doc.
  464. X
  465. X
  466. X     AFTER INSTALLATION
  467. X     ^^^^^^^^^^^^^^^^^^
  468. X     0. Print the man pages:
  469. X     
  470. X             psfnroff -man *.1
  471. X
  472. X     1. Verify that the imageable area of your printer actually
  473. X    corresponds to the printer definition that you selected during
  474. X    the install process. Send the postscript file "psizes.ps" (or
  475. X    getsizes.ps) to the line printer by some method:
  476. X
  477. X        copy psizes.ps prn
  478. X        -or-
  479. X        copy getsizes.ps prn
  480. X
  481. X    This programme prints the actual imageable area for each page
  482. X    size known to your printer.
  483. X
  484. X    The printed imageable area numbers should match the corresponding
  485. X    numbers in psfprint.def.  If they do not, edit psfprint.def
  486. X    to use the printed numbers. (Even Adobe information does not
  487. X    necessarily reflect the real nature of your printer.  My own
  488. X    Nec LC890 had a different letter imageable area than indicated
  489. X    by the original .ppd file from Adobe...).
  490. X
  491. X    Read "Install.def" if the editing process in not transparent!
  492. X
  493. X    Copy the new psfprint.def file to it's target location as
  494. X    set with "DEFFILE" in the Makefile.
  495. X
  496. X     2.    Examine "Testfile". This file is an example of how escape 
  497. X    seqeuences can be imbedded in a text file to allow direct font
  498. X    control within a text editor (See psf.1 for details).
  499. X    All of the "005" values must be edited to become a CLT/E
  500. X    before the test will work correctly.
  501. X
  502. X    After examining it,  do the following:
  503. X
  504. X        psf example > prn
  505. X    
  506. X    to see how font control can work in a text file.
  507. X
  508. X    FILES NEEDED for DOS
  509. X    ^^^^^^^^^^^^^^^^^^^^
  510. X       The following files are needed for a dos source distribution:
  511. X   
  512. X             psf.c
  513. X             psfbs.c
  514. X             psfdoub.c
  515. X             psf.h
  516. X         ctp.h
  517. X             patchlevel.h
  518. X         psfproto.h
  519. X             psfnroff.bat
  520. X             getprint.bat
  521. X             psdouble.bat
  522. X             Install.dos
  523. X             Install.def
  524. X             Makefile.dos
  525. X             NOTICE
  526. X             README
  527. X             testfile
  528. X             getsizes.PS
  529. X             selectdef.c
  530. X         man/*.*
  531. X         language.PSF
  532. X             defs/*.def
  533. X ------------------------------------------
  534. X   Tony Field:  tony@ajfcal.cuc.ab.ca
  535. END_OF_FILE
  536. if test 7837 -ne `wc -c <'Install.dos'`; then
  537.     echo shar: \"'Install.dos'\" unpacked with wrong size!
  538. fi
  539. # end of 'Install.dos'
  540. fi
  541. if test -f 'Install.unix' -a "${1}" != "-c" ; then 
  542.   echo shar: Will not clobber existing file \"'Install.unix'\"
  543. else
  544. echo shar: Extracting \"'Install.unix'\" \(10693 characters\)
  545. sed "s/^X//" >'Install.unix' <<'END_OF_FILE'
  546. X                   P S F     I N S T A L L A T I O N
  547. X                   =================================
  548. X
  549. X     The following installation process should work with various forms
  550. X     of unix using lpr/lpd and with System V r3 unix lp/lpsched
  551. X     spoolers. The documented spooler installation process is not
  552. X     compatible for System V r4: the printer spool scripts must be
  553. X     manually installed (and possibly modified).
  554. X
  555. X     If spooler support is installed, any file sent to the spooler
  556. X     is examined: if the file is already in postscript form, then
  557. X     the file is simply copied to the printer without any re-processing.
  558. X     Only unprocessed text files will be filtered into postscript form.
  559. X     As a result, 'any' file may be passed to the spooler for correct
  560. X     processing.  (If postscript sources is to be printed, the "-z"
  561. X     option must be used for force the printing.)
  562. X
  563. X     INSTALLATION
  564. X     ^^^^^^^^^^^^
  565. X     1.    Edit the Makefile, changing the various configuration parameters.
  566. X    The general install steps are:
  567. X
  568. X        make all
  569. X        make printer
  570. X        make scripts
  571. X        make install
  572. X        make installman   (or installcat or installdoc)
  573. X
  574. X    If nroff is not available, pre-formatted man pages are in
  575. X    /man/*.doc.
  576. X
  577. X     2.    Build the binaries with:
  578. X
  579. X        make all
  580. X
  581. X     3.    Select a printer:
  582. X
  583. X        make printer
  584. X   
  585. X    If your printer is not specified, select the nearest
  586. X    approximation and/or read the "Install.def" file.
  587. X
  588. X    "make printer" can be run any number of times.  It simply copies
  589. X    your selected printer definition from the ./defs directory
  590. X    to file "psfprint.def" in the current directory and generates 
  591. X    an associated "psizes.ps".
  592. X    
  593. X    If you are using a serial printer and using lp/lpsched, examine
  594. X    the "stty" command to set port characteristics in psfunix.LP
  595. X    (which is the prototype for the printer model "psf" when used
  596. X    with lp/lpsched).
  597. X
  598. X     4.    Make shell scripts:
  599. X     
  600. X    Some man systems may require additional options before the shell
  601. X    script "psfman" can successfully process man pages through the
  602. X    psf filters system. Examine and modify the file "psfman.SH" for
  603. X    additional man options needed.  On some systems, you man
  604. X    need to specify the full path to the "man" programme and/or
  605. X    force the option "-Tlp".
  606. X    
  607. X    Now build the shell scripts.
  608. X
  609. X        make scripts
  610. X
  611. X    (NOTE: script psfdouble is created as an example of setting
  612. X           up a double sided print script, however is not
  613. X           installed by any install process.)
  614. X
  615. X     5. Iff nroff is available, make nroff'd man pages. The resulting 
  616. X        *.doc files are written to the man/ directory.
  617. X     
  618. X             make doc
  619. X    
  620. X    If nroff is not available, pre-formatted documentation is
  621. X    provided in various *.doc files.  These may be moved to
  622. X    the catman or man directories with "make installdoc".  The
  623. X    target directory for the preformatted pages is set in the
  624. X    makefile (MANDIR).
  625. X    
  626. X     6. A "user" installation copies only those modules that are 
  627. X    necessary for command line use. It does not copy spooler support
  628. X    binaries and scripts.
  629. X
  630. X    A "user" installation is complete after (as root):
  631. X
  632. X        make installuser
  633. X     
  634. X     7. A "full" installation copies all necessary spooler support
  635. X    as well as user binaries and scripts to the target directories.
  636. X         As root:
  637. X         
  638. X             make install
  639. X
  640. X     8. Install man pages if desired. Depending upon the type of system
  641. X    being used, select from the following:
  642. X    
  643. X       make installman    Install unformatted pages into the man
  644. X                directory. This assumes that a complete 
  645. X                man system is available with nroff.
  646. X
  647. X       make installcat    Install formatted man pages into the 
  648. X                   catman directory. Nroff must be available 
  649. X                   to format the text.
  650. X
  651. X       make installdoc    Install pre-formatted man pages into 
  652. X                   the catman (or selected man) directory. 
  653. X                   This copies various *.doc files into 
  654. X                   the catman directory: nroff is not needed.
  655. X
  656. X       make doc        Build .doc formatted files from .1
  657. X                unformatted man page with nroff.
  658. X    
  659. X     9.    Three versions of psf are compiled by "make all":
  660. X
  661. X       psf           is normally used at the command line.
  662. X            If the input is already in postscript, then it is
  663. X            re-processed. I.e. you can print a postscript
  664. X            programme. Input is accepted from stdin or from
  665. X            file names.
  666. X
  667. X       psffilter    is used by the lp/lpsched spooling system.
  668. X            It accepts input only on stdin and arguments
  669. X            passed with the "-o" option. If the input is
  670. X            already in postscript, the input is simply copied
  671. X            to stdout (the printer).  If the -v option
  672. X            is used, postscript sources may be printed.
  673. X
  674. X       psflpd    is used by the lpr/lpd spooling system. It
  675. X            accepts input only on stdin and cannot accept any
  676. X            run-time arguments, not even those passed by lpd.
  677. X            If the input is already in postscript, it is
  678. X            simply copied to stdout (the printer).  If
  679. X            the -v option is used, postscript sources
  680. X            may be printed.
  681. X
  682. X            Printcap entries should use this binary or links
  683. X            to this binary. If psflpd is executed with
  684. X            different names, then different default page
  685. X            conditions apply (see Install.lpd).
  686. X    
  687. X    Only the appropriate binary versions are copied with "make install".
  688. X
  689. X
  690. X     CONFIGURE PRINTER (for lp/lpsched on SysV R3)
  691. X     ^^^^^^^^^^^^^^^^^
  692. X    The printer model defined for psf is copied during the install
  693. X    process to:
  694. X
  695. X        /usr/spool/lp/model/psf
  696. X   
  697. X    Printer installation is usually be done with lpadmin. If you
  698. X    install the printer with lpadmin, be sure to specify the 
  699. X    "-m psf" option to select the psf printer model. E.g.:
  700. X
  701. X        /usr/lib/lpadmin -p printer -v /dev/lp -m psf -o nobanner
  702. X
  703. X    If you are using Interactive Unix 2.2, the you might wish
  704. X    to use "sysadm lpmgmt".  This can be done if you first
  705. X    inform sysadm that psf exists:
  706. X
  707. X
  708. X        edit /usr/admin/menu/packagemgmt/lpmgmt/lpsetup
  709. X                        - to have psf as a 
  710. X                          valid printer choice.
  711. X
  712. X        sysadm lpmgmt            - add psf printer
  713. X
  714. X        /usr/lib/lpadmin -d printer     - set default printer
  715. X
  716. X        enable printer.
  717. X   
  718. X
  719. X     CONFIGURE PRINTER (for lpr/lpd)
  720. X     ^^^^^^^^^^^^^^^^^
  721. X    After "make install" is completed, the printcap must be
  722. X    configured. See "Install.lpd" for suggestions.
  723. X
  724. X
  725. X     CONFIGURE PRINTER (for use with lp/lpsched over UUCP)
  726. X     ^^^^^^^^^^^^^^^^^
  727. X    A sample printer model "nlsdumb" is provided if you wish to use
  728. X    remote printing over uucp (either by serial line or over the
  729. X    tcp/ip+TLI interface). It must be manually installed if it is
  730. X    needed.
  731. X
  732. X
  733. X     MAN PAGES
  734. X     ^^^^^^^^^
  735. X    The man pages are all the man/*.1 files. These may be formatted
  736. X    with nroff or cawf.  Pre-formatted man pages are man/*.doc.
  737. X    
  738. X
  739. X     AFTER INSTALLATION
  740. X     ^^^^^^^^^^^^^^^^^^
  741. X     0. Print the man pages:
  742. X     
  743. X             psfnroff -man *.1
  744. X
  745. X     1. Verify that the imageable area of your printer actually
  746. X    corresponds to the printer definition that you selected during
  747. X    the install process. Send the postscript file "psizes.ps" (or
  748. X    getsizes.ps) to the line printer by some method:
  749. X
  750. X        lp psizes.ps
  751. X        -or-
  752. X        cat getsizes.ps > /dev/lp
  753. X
  754. X    This programme prints the actual imageable area for each page
  755. X    size known to your printer.
  756. X
  757. X    The printed imageable area (the last 4 numbers of each page
  758. X    type) should match the corresponding numbers in psfprint.def. If
  759. X    they do not, edit psfprint.def to use the printed numbers. (Even
  760. X    Adobe information does not necessarily reflect the real nature
  761. X    of your printer. My own Nec LC890 had a different letter
  762. X    imageable area than indicated by the original .ppd file from
  763. X    Adobe...).
  764. X
  765. X    Read "Install.def" if the editing process in not transparent!
  766. X
  767. X    Copy the new psfprint.def file to it's target location as
  768. X    set with "DEFFILE" in the Makefile.
  769. X
  770. X     2.    Edit the file "Testfile" with sed (as below). This file is an
  771. X    example of how escape seqeuences can be imbedded in a text file
  772. X    to allow direct font control within a text editor (See psf.1 for
  773. X    details).
  774. X
  775. X    The "Testfile" should contain many ^E characters (octal \005).
  776. X    Since mail system may change the ^E character into the text
  777. X    string "005" You will have to edit the testfile and replace all
  778. X    "005" strings with true ctrl-E character.
  779. X
  780. X    One easy way to correct this is with sed (Bourne shell only??)
  781. X
  782. X        sed 's@005@<CTRL-E>@g' Testfile > example
  783. X               +------+
  784. X                actually type the CTRL-E character
  785. X                to generate the octal charcter \005
  786. X
  787. X    After editing, do the following:
  788. X
  789. X        psf example | lp
  790. X    
  791. X    to see how font control can work in a text file.
  792. X
  793. X
  794. X     LP OPTIONS    (for lp/lpsched)
  795. X     ^^^^^^^^^^
  796. X    The provided printer model (/usr/spool/lp/model/psf and it's
  797. X    associated prototype file psfunix.LP) allows the use of the "-o"
  798. X    to pass options to psf. Two additional non-standard banner page
  799. X    options may be passed to the printer script:
  800. X
  801. X        banner        = print banner page
  802. X        nobanner    = do not print banner page
  803. X
  804. X    For example:
  805. X
  806. X        lp -o"nobanner -4xh" my.text.file
  807. X        lp -o"banner" another.file
  808. X
  809. X    The psf printer model examines the printer configuration file
  810. X    in:
  811. X
  812. X        /usr/spool/lp/admins/lp/printers
  813. X            /<printer name>/configuration
  814. X
  815. X    to determine if banners are required. The first line of this
  816. X    script normally contains one of the following (and can be set by
  817. X    lpadmin):
  818. X
  819. X        Banner: on:Always
  820. X        Banner: on
  821. X
  822. X    An additional option is recognized (and cannot be set by
  823. X    lpadmin: it must be manually edited into the configuration
  824. X    file):
  825. X
  826. X        Banner: off
  827. X
  828. X    "Banner: on:Always" forces banners to be printed, even if the
  829. X    user specified "nobanner".
  830. X
  831. X    "Banner: on" prints a banner page unless the user specifies
  832. X    "nobanner". If "nobanner" is provided, then the banner is not
  833. X    printed.
  834. X
  835. X    "Banner: off" will not print the banner page unless the user
  836. X    provides "banner", in which case the banner page is printed.
  837. X
  838. X
  839. X     MULTIPLE PRINTERS
  840. X     ^^^^^^^^^^^^^^^^^
  841. X    If multiple different postscript printers are used with psf,
  842. X    then either separate versions of psf and friends must be
  843. X    constructed or the "-u alt.def" option of psf and psffilter
  844. X    should be used. In any case, each back end printer script used
  845. X    by lpsched, psnroff or psmbox must reference the appropriate
  846. X    version of psf or have the -u option set.
  847. X
  848. X    See Install.lpd for considerations when using lpr/lpd.
  849. X
  850. X    Some provisions are in the Makefile to allow changes to the
  851. X    target directories or the use of different binary programme
  852. X    names.
  853. X
  854. X     PSF notes.
  855. X     ^^^^^^^^^^ 
  856. X    The printer definitions in defs/* are derived from the Adobe
  857. X    ".ppd" files. These are available from the Adobe file server via
  858. X    email. The .ppd files describe each know printer characteristics
  859. X    - but are not always perfectly accurate.
  860. X    
  861. X    The programme "table" is used to translate the ".ppd" files into
  862. X    ".def" printer definition files used by psf. Documentation for
  863. X    "table" is not provided - other than the comments in "table.c"
  864. X    and a brief comment in Install.def.
  865. X
  866. X    -------------------
  867. X    Tony Field
  868. X        (tony@ajfcal.cuc.ab.ca)
  869. END_OF_FILE
  870. if test 10693 -ne `wc -c <'Install.unix'`; then
  871.     echo shar: \"'Install.unix'\" unpacked with wrong size!
  872. fi
  873. # end of 'Install.unix'
  874. fi
  875. if test -f 'Makefile' -a "${1}" != "-c" ; then 
  876.   echo shar: Will not clobber existing file \"'Makefile'\"
  877. else
  878. echo shar: Extracting \"'Makefile'\" \(10234 characters\)
  879. sed "s/^X//" >'Makefile' <<'END_OF_FILE'
  880. X# $Id: Makefile,v 3.2 1992/01/19 05:50:33 ajf Exp ajf $
  881. X#
  882. X#    Make the psf v3 postscript filter system
  883. X#    ----------------------------------------
  884. X
  885. X#    display all "make" options with:
  886. X#
  887. X#        make
  888. X#    or:
  889. X#        make help
  890. X
  891. XSHELL = /bin/sh
  892. X
  893. X# - - - - Begin configuration - - - - -
  894. X#
  895. X# set compiler, tar and nroff names
  896. X
  897. X# CC=cc
  898. XCC = gcc
  899. X# CC=lpicc -sys -xid
  900. X
  901. X# TAR = tar
  902. XTAR = gtar
  903. X
  904. XNROFF = nroff
  905. X# NROFF = cawf
  906. X
  907. X# man directory  (if you have man or catman directories)
  908. XMANDIR=/usr/man/manl
  909. X# MANDIR=/usr/man/man1
  910. X# MANDIR=/usr/catman/u_man/manl
  911. X# MANDIR=/usr/catman/u_man/man1
  912. X# MANDIR=/usr/man/man.1
  913. X
  914. X# If catman/formatted pages should be filtered with col
  915. X# COL=
  916. XCOL=| col -b 
  917. X
  918. X# user print interface
  919. XUPRINT =lpr
  920. X# UPRINT =lp
  921. X
  922. X# Location of user binaries and scripts  (for both lp/lpsched and lpr/lpd)
  923. XBINDIR=/usr/local/bin
  924. X# BINDIR=/local/bin
  925. X
  926. X# lpd filter directory  (ignored for lp/lpsched)
  927. XLPDDIR=/usr/local/lib/psf
  928. X# LPDDIR=/local/lib/psf
  929. X
  930. X# Location of printer definition file   (for lpr/lpd or lp/lpsched)
  931. XDEFFILE=/usr/local/lib/psf/psfprint.def
  932. X# DEFFILE=/local/lib/psf/psfprint.def
  933. X# DEFFILE=/usr/spool/lp/model/psfprint.def
  934. X
  935. X# Set the default paper type  (letter, legal, a4, b5, etc.)
  936. XPSPTYPE = letter
  937. X
  938. X# if 2 paper trays, specifiy -DHOPPER  for double sided printing.
  939. X#        Second tray should be reserved for double sided printing only!
  940. X# TRAYS=
  941. XTRAYS=-DHOPPER
  942. X
  943. X# compile and library options
  944. XLDFLAGS = -lm
  945. XCFLAGS = -O $(NAMES) $(PAPTYPE) $(TRAYS) -DBINDIR=\"$(BINDIR)\" -DPDEF=\"$(DEFFILE)\" 
  946. X
  947. X# extra things for SysV or Xenix with lp/lpsched
  948. XMODEL=/usr/spool/lp/model
  949. X
  950. X# if getopt isn't a standard part of your system
  951. X# GETOPT = getopt.o
  952. X
  953. X# -- usually, nothing below needs changing --
  954. X
  955. X# Names of executable binaries  (See "Multiple printer support" in README)
  956. XPSF = psf
  957. XPSFDOUB = psfdoub
  958. XPSFBANNER = psfbanner
  959. XPSFFILTER = psffilter
  960. XPSFLPD = psflpd
  961. X
  962. XRCSVER = 3.2
  963. XRCSCOM="psf3, patch 2"
  964. X
  965. X# - - - - - end configuration - - - - - - - -
  966. X#           ^^^^^^^^^^^^^^^^^
  967. X
  968. X# psf uses NAMES to find the current name of psfdoub
  969. X
  970. XNAMES = -DPSFDOUB=\"$(PSFDOUB)\"
  971. X
  972. XSOURCES  = psf.c psfbs.c psfmail.c psfdoub.c psfbanner.c psdetect.c \
  973. X        selectdef.c table.c psf.h psfproto.h ctp.h
  974. XOBJECTS  = psf.o psfbs.o psfmail.o psfdoub.o psfbanner.o psdetect.o
  975. XBINARIES = $(PSF) psfbs psfmail $(PSFDOUB)
  976. XLPBIN    = $(PSFBANNER) $(PSFFILTER)
  977. XLPDBIN   = $(PSFLPD)
  978. XSCRIPTS  = psfnroff psfman psfmbox
  979. XSUPPORT  = selectdef table
  980. XOTHERS     = Makefile README  NOTICE Install.unix Install.lpd Install.def \
  981. X        Testfile psfunix.LP getsizes.PS psfxenix.LP \
  982. X        nlsdumb psfmbox.SH psfman.SH psfnroff.SH getopt.c Install.dos \
  983. X        Changes Makefile.dos psfnroff.bat printcap.ETC \
  984. X        psfdouble.SH psdouble.bat getprint.bat language.PSF psflpd.DEF \
  985. X        printcap.NET
  986. XPATCHLEV = patchlevel.h
  987. XDOSSRC   = psf.c psfbs.c psfdoub.c selectdef.c psf.h psfnroff.bat \
  988. X        patchlevel.h getsizes.PS getopt.c getprint.bat psfproto.h ctp.h
  989. XDOSMAN   = man/psf.1 man/psfbs.1 man/psfdoub.1 man/psfnroff.1
  990. XDOSDOC   = man/psf.doc man/psfbs.doc man/psfdoub.doc man/psfnroff.doc
  991. XDOSOTHER = Makefile.dos NOTICE README Install.dos Install.def Testfile \
  992. X        example psdouble.bat language.PSF
  993. X
  994. X
  995. XPTYPE = \"$(PSPTYPE)\"
  996. XPAPTYPE = -DPAPERTYPE=$(PTYPE)
  997. X
  998. X
  999. X
  1000. X# make help
  1001. X# ^^^^^^^^^
  1002. Xhelp:
  1003. X    @echo " "
  1004. X    @echo "First:  make the following in order"
  1005. X    @echo "  'make all'          compile sources"
  1006. X    @echo "  'make printer'      select a printer"
  1007. X    @echo "  'make scripts'      tailor scripts"
  1008. X    @echo " "
  1009. X    @echo "Then:  select one of the following installations"
  1010. X    @echo "  'make install'      install all user and spooler files"
  1011. X    @echo "  'make installuser'  install only user binaries and scripts"
  1012. X    @echo "  'make installbin'   re-install binaries only after a source patch"
  1013. X    @echo "  'make installxenix' may work - no longer spported"
  1014. X    @echo " "
  1015. X    @echo "Others:"
  1016. X    @echo "  'make installman'   install unformatted $(MANDIR) pages"
  1017. X    @echo "  'make installcat'   format/install $(MANDIR) pages (needs nroff)"
  1018. X    @echo "  'make installdoc'   install formatted $(MANDIR) pages (no nroff)"
  1019. X    @echo "  'make doc'          generate formatted .doc from .1 pages (needs nroff)"
  1020. X    @echo "  'make tar'          tar the original sources  (/tmp/psf.tar)"
  1021. X    @echo "  'make dostar'       tar things useful for dos (/tmp/psfdos.tar)"
  1022. X    @echo "  'make shar'         make shar'ed kit for email"
  1023. X    @echo "  'make clean'        remove anything that can be rebuilt"
  1024. X
  1025. X
  1026. X
  1027. X# Compile all sources
  1028. X# ^^^^^^^
  1029. Xall:    $(BINARIES) $(LPBIN) $(LPDBIN) $(SUPPORT) getsizes.ps
  1030. X
  1031. X$(PSF):    psf.c psf.h ctp.h $(GETOPT)
  1032. X    $(CC) $(CFLAGS) psf.c $(GETOPT) -o $(PSF) $(LDFLAGS)
  1033. X
  1034. X$(PSFDOUB):    psfdoub.c psf.h $(GETOPT)
  1035. X    $(CC) $(CFLAGS) psfdoub.c $(GETOPT) -o $(PSFDOUB) $(LDFLAGS)
  1036. X
  1037. X$(PSFFILTER):    psf.c psf.h $(GETOPT) ctp.h
  1038. X    $(CC) $(CFLAGS) -DPSFFILTER psf.c $(GETOPT) -o $(PSFFILTER) $(LDFLAGS)
  1039. X
  1040. X$(PSFLPD):    psf.c $(GETOPT) ctp.h psf.h
  1041. X    $(CC) $(CFLAGS) -DFORLPD -DPSFFILTER $(GETOPT) psf.c -o $(PSFLPD) $(LDFLAGS)
  1042. X
  1043. X$(PSFBANNER):    psfbanner.c psf.h ctp.h $(GETOPT)
  1044. X    $(CC) $(CFLAGS) psfbanner.c $(GETOPT) -o $(PSFBANNER) $(LDFLAGS)
  1045. X
  1046. Xpsfbs:        psfbs.c psf.h $(GETOPT)
  1047. X    $(CC) $(CFLAGS) psfbs.c $(GETOPT) -o psfbs $(LDFLAGS)
  1048. X
  1049. Xpsfmail:    psfmail.c psf.h $(GETOPT)
  1050. X    $(CC) $(CFLAGS) psfmail.c $(GETOPT) -o psfmail $(LDFLAGS)
  1051. X
  1052. Xselectdef:    selectdef.c psf.h ctp.h $(GETOPT)
  1053. X    $(CC) $(CFLAGS) selectdef.c $(GETOPT) -o selectdef $(LDFLAGS)
  1054. X
  1055. Xtable:        table.c psf.h $(GETOPT)
  1056. X    $(CC) $(CFLAGS) table.c $(GETOPT) -o table $(LDFLAGS)
  1057. X
  1058. Xgetsizes.ps:
  1059. X    sed "s@%letter@$(PSPTYPE)@g" getsizes.PS > getsizes.ps
  1060. X
  1061. X# make all scripts for both lpr and lp.  install will use as needed
  1062. X
  1063. Xscripts:
  1064. X    sed "s@PRINTER@$(UPRINT)@g" psfmbox.SH  > psfmbox
  1065. X    sed "s@PRINTER@$(UPRINT)@g" psfman.SH   > psfman
  1066. X    sed "s@PRINTER@$(UPRINT)@g" psfnroff.SH > psfnroff
  1067. X    sed "s@PRINTER@$(UPRINT)@g" psfdouble.SH > psfdouble
  1068. X    sed "s@LPDFILTERS@$(LPDDIR)@g" printcap.ETC > printcap
  1069. X    sed "s@BINARY@$(BINDIR)@g" psfunix.LP \
  1070. X        | sed "s@PAGETYPE@$(PSPTYPE)@g"   \
  1071. X        | sed "s@DEFFILE@$(DEFFILE)@g" > psf.model
  1072. X    chmod +x $(SCRIPTS) psf.model
  1073. X
  1074. X
  1075. X# Create a printer selection
  1076. X# ^^^^^^^^^^^^^^^^^^^^^^^^^^
  1077. Xprinter:
  1078. X    selectdef defs/*.def
  1079. X    @test -r psfprint.def || ( echo "Error: cannot find psfprint.def" ;  exit 1)
  1080. X    @chmod 644 psfprint.def
  1081. X    @if ( test  $(UPRINT) = lpr )  then rm -f zz91 ; \
  1082. X         mv psfprint.def zz91 ; \
  1083. X         cat psflpd.DEF zz91 > psfprint.def ; \
  1084. X         rm zz91 ; fi
  1085. X
  1086. X# Install system
  1087. X# ^^^^^^^^^^^^^^
  1088. Xinstall:
  1089. X    @if ( test $(UPRINT) = lpr ) then make installbsd ; \
  1090. X        else make installsysv ; fi
  1091. X
  1092. Xinstallbsd:
  1093. X    @echo "Full installation for lpr/lpd spooler systems."
  1094. X    @test -r psfprint.def || ( make help ; exit 1)
  1095. X    @test -r psfmbox || ( make help ; exit 1)
  1096. X    @test -w $(LPDDIR) || ( echo Directory $(LPDDIR) not available ; exit 1)
  1097. X    @test -w $(BINDIR) || ( echo Directory $(BINDIR) not available ; exit 1)
  1098. X    strip $(LPDBIN) $(LPBIN) $(BINARIES) $(SUPPORT)
  1099. X    cp $(LPDBIN) $(LPDDIR)
  1100. X    cp $(BINARIES) $(SCRIPTS) $(BINDIR)
  1101. X    cp psfprint.def $(DEFFILE)
  1102. X    ln -f $(LPDDIR)/$(PSFLPD)  $(LPDDIR)/post
  1103. X    ln -f $(LPDDIR)/$(PSFLPD)  $(LPDDIR)/p2up
  1104. X    ln -f $(LPDDIR)/$(PSFLPD)  $(LPDDIR)/p4up
  1105. X    ln -f $(LPDDIR)/$(PSFLPD)  $(LPDDIR)/p132x60
  1106. X    ln -f $(LPDDIR)/$(PSFLPD)  $(LPDDIR)/paccount
  1107. X    ln -f $(LPDDIR)/$(PSFLPD)  $(LPDDIR)/psource
  1108. X    ln -f $(LPDDIR)/$(PSFLPD)  $(LPDDIR)/plegal
  1109. X    ln -f $(LPDDIR)/$(PSFLPD)  $(LPDDIR)/pspread
  1110. X
  1111. Xinstallsysv:
  1112. X    @echo "Full installation for lp/lpsched spooler systems."
  1113. X    @test -r psfprint.def || ( make help ; exit 1)
  1114. X    @test -r psfmbox || ( make help ; exit 1)
  1115. X    @test -w $(BINDIR) || ( echo Directory $(BINDIR) not available ; exit 1)
  1116. X    cp psfprint.def $(DEFFILE)
  1117. X    cp psf.model $(MODEL)/psf
  1118. X    chown lp $(MODEL)/psf $(DEFFILE)
  1119. X    chgrp bin $(MODEL)/psf $(DEFFILE)
  1120. X    strip $(BINARIES) $(LPBIN) $(SUPPORT)
  1121. X    cp $(BINARIES) $(LPBIN) $(SCRIPTS) $(BINDIR)
  1122. X
  1123. Xinstalluser:
  1124. X    @echo "User binary and script installation. (Spooler support not installed.)"
  1125. X    @test -r psfprint.def || ( make help ; exit 1)
  1126. X    @test -r psfmbox || ( make help ; exit 1)
  1127. X    @test -w $(BINDIR) || ( echo Directory $(BINDIR) not available ; exit 1)
  1128. X    cp psfprint.def $(DEFFILE)
  1129. X    strip $(BINARIES) $(SUPPORT)
  1130. X    cp $(BINARIES) $(SCRIPTS) $(BINDIR)
  1131. X
  1132. Xinstallxenix:            # SysV except for printer model details.
  1133. X    @echo "Full Xenix installation for lp/lpsched spooler systems."
  1134. X    @test -r psfprint.def || ( make help ; exit 1)
  1135. X    @test -r psfmbox || ( make help ; exit 1)
  1136. X    @test -w $(BINDIR) || ( echo Directory $(BINDIR) not available ; exit 1)
  1137. X    sed "s@BINARY@$(BINDIR)@g" psfxenix.LP \
  1138. X        | sed "s@PAGETYPE@$(PTYPE)@g"   \
  1139. X        | sed "s@DEFFILE@$(DEFFILE)@g" > psf.model
  1140. X    chmod +x psf.model
  1141. X    cp psfprint.def $(DEFFILE)
  1142. X    cp psf.model $(MODEL)/psf
  1143. X    chown lp $(MODEL)/psf $(DEFFILE)
  1144. X    chgrp bin $(MODEL)/psf $(DEFFILE)
  1145. X    strip $(BINARIES) $(SUPPORT)
  1146. X    cp $(BINARIES) $(SCRIPTS) $(BINDIR)
  1147. X
  1148. Xinstallbin:
  1149. X    @echo "Binary re-install."
  1150. X    @test -w $(BINDIR) || ( echo Directory $(BINDIR) not available ; exit 1)
  1151. X    strip $(BINARIES)
  1152. X    cp $(BINARIES) $(BINDIR)
  1153. X
  1154. X
  1155. X# Man page generation
  1156. X# ^^^^^^^^^^^^^^^^^^^
  1157. X
  1158. Xinstallman:
  1159. X    cd man ; make installman MANDIR=$(MANDIR) NROFF=$(NROFF) COL="$(COL)"
  1160. X
  1161. Xinstallcat:
  1162. X    cd man ; make installcat MANDIR=$(MANDIR) NROFF=$(NROFF) COL="$(COL)"
  1163. X
  1164. Xinstalldoc:
  1165. X    cd man ; make installdoc MANDIR=$(MANDIR) NROFF=$(NROFF) COL="$(COL)"
  1166. X
  1167. Xdoc:
  1168. X    cd man ; make doc MANDIR=$(MANDIR) NROFF=$(NROFF) COL="$(COL)"
  1169. X
  1170. X# Copy distribution files
  1171. X# ^^^^^^^^^^^^^^^^^^^^^^^
  1172. Xtar:
  1173. X    $(TAR) cvf /tmp/psf.tar $(SOURCES) man $(OTHERS) defs Makefile.dis Makefile.ajf patchlevel.h
  1174. X
  1175. Xshar:
  1176. X    makekit -m -s54k defs man man/*.1 man/*.doc man/Makefile defs/* $(SOURCES) $(OTHERS) patchlevel.h
  1177. X
  1178. Xdostar:
  1179. X    $(TAR) cvf /tmp/psfdos.tar $(DOSSRC) $(DOSMAN) $(DOSDOC) $(DOSOTHER) defs
  1180. X
  1181. X
  1182. X# Create .def files from .ppd
  1183. X# ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  1184. X
  1185. Xdef:
  1186. X    table $$HOME/adobe/ppd/*.ppd defs
  1187. X
  1188. X# RCS checkin and out
  1189. X# ^^^^^^^^^^^^^^^^^^^
  1190. X
  1191. Xci:
  1192. X    ci -r$(RCSVER) patchlevel.h
  1193. X    ci -r$(RCSVER) -m$(RCSCOM) $(SOURCES) $(OTHERS) Makefile.dis Makefile.ajf lines.c
  1194. X
  1195. Xciman:
  1196. X    cd man ; make ci RCSVER=$(RCSVER) RCSCOM=$(RCSCOM)
  1197. X    
  1198. X
  1199. Xco:
  1200. X    co -l $(SOURCES) $(OTHERS) Makefile.dis Makefile.ajf Makefile patchlevel.h lines.c
  1201. X
  1202. Xcoman:
  1203. X    cd man ; make co RCSVER=$(RCSVER)
  1204. X
  1205. X# Remove anything that cannot be rebuilt
  1206. X# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  1207. Xclean:
  1208. X    rm -f $(BINARIES) $(SCRIPTS) $(SUPPORT) $(LPBIN) $(LPDBIN) psfdouble
  1209. X    rm -f *.o 
  1210. X    rm -f *.B
  1211. X    rm -f *.doc
  1212. X    rm -f *~
  1213. X    rm -f psf.model getsizes.ps psfprint.def psizes.ps printcap
  1214. X    cd man ; make clean
  1215. END_OF_FILE
  1216. if test 10234 -ne `wc -c <'Makefile'`; then
  1217.     echo shar: \"'Makefile'\" unpacked with wrong size!
  1218. fi
  1219. # end of 'Makefile'
  1220. fi
  1221. if test -f 'table.c' -a "${1}" != "-c" ; then 
  1222.   echo shar: Will not clobber existing file \"'table.c'\"
  1223. else
  1224. echo shar: Extracting \"'table.c'\" \(9590 characters\)
  1225. sed "s/^X//" >'table.c' <<'END_OF_FILE'
  1226. X/* ta=4 */
  1227. X/************************************************************************
  1228. X*                    t a b l e . c                                        *
  1229. X*                                                                        *
  1230. X*    Generate the *.def tables required by psf to describe a printer        *
  1231. X*                                                                        *
  1232. X*    Scans the Adobe *.ppd files for specific parametric lines.            *
  1233. X*    Tony FIeld,   tony@ajfcal.cuc.ab.ca                                `    *
  1234. X************************************************************************/
  1235. X/*
  1236. X * $Id: table.c,v 3.2 1992/01/19 05:50:33 ajf Exp ajf $
  1237. X *
  1238. X*/
  1239. X
  1240. X/*    Usage:    table files.ppd ...  destination.dir
  1241. X
  1242. X        where:    files.ppd are the various .ppd files to be converted.
  1243. X                destination.dir is the destination directory in which
  1244. X                    to place the generated .def file(s)
  1245. X        
  1246. X    The layout of the generated .def files is:
  1247. X
  1248. X*printer                                <-- marker
  1249. XNEC LC-890 v47.0 (modified)             <-- printer name for selectdef
  1250. X                                            (from *Nickname)
  1251. XLetter                                  <-- user name (e.g.   psf -g Letter)
  1252. X                                            (from *PageSize)
  1253. Xstatusdict begin lettertray end         <-- actual postscript to select size
  1254. X                                            (from *PageSize)
  1255. X  612   792    18    15   599   776     <-- page width page height LLx LLy URx URy
  1256. X                                              (page width/height from *PaperDimension)
  1257. X                                            (LLx LLy URx URy from *ImageableArea)
  1258. XLegal
  1259. Xstatusdict begin legaltray end
  1260. X  612  1008    18    19   593   990
  1261. XA4
  1262. Xstatusdict begin a4tray end
  1263. X  595   842    10     8   585   813
  1264. XB5
  1265. Xstatusdict begin b5tray end
  1266. X  516   729    18     7   482   702
  1267. X*order                                    <-- marker for output order
  1268. X                                            from DefaultOutputOrder or
  1269. X                                            OutputOrder
  1270. XNormal                                    <-- default output order
  1271. Xstatusdict begin 0 setoutputtray end    <-- set to normal
  1272. Xstatusdict begin 1 setoutputtray end    <-- set to reverse
  1273. X*fonts                                  <-- marker for fonts
  1274. XAvantGarde-Book                         <-- real font names in font dictionary
  1275. XAvantGarde-Demi                                (from *Font)
  1276. XBookman-Demi
  1277. XBookman-Light
  1278. XCourier
  1279. XHelvetica
  1280. XHelvetica-Narrow
  1281. XNewCenturySchlbk-Roman
  1282. XPalatino-Roman
  1283. XSymbol
  1284. XTimes-Roman
  1285. XZapfChancery-MediumItalic
  1286. XZapfDingbats
  1287. X*slots                                    <-- marker for paper tray select
  1288. Xstatusdict begin 1 setpapertray end     <-- select first tray
  1289. Xstatusdict begin 2 setpapertray end     <-- select second tray  etc..
  1290. X                                            (from *InputSlot)
  1291. X*eof                                    <-- logical end of printer definition
  1292. X*/
  1293. X
  1294. X#include <stdio.h>
  1295. X#include <string.h>
  1296. X#include <sys/types.h>
  1297. X#include <sys/stat.h>
  1298. X#include <ctype.h>
  1299. X
  1300. Xchar    nickname[200];
  1301. Xstruct pdef
  1302. X{
  1303. X    char    name[500];
  1304. X    char    set[500];
  1305. X    char    tray[500];
  1306. X    int        lx, ly, ux, uy, sx, sy;
  1307. X} ;
  1308. X
  1309. Xstruct outorder
  1310. X{    char    bydefault[100];
  1311. X    char    normal[150];
  1312. X    char    reverse[150];
  1313. X} order;
  1314. X
  1315. Xchar    *malloc();
  1316. Xchar    pname[100];
  1317. Xstruct pdef printer[40], pblank;
  1318. Xint        nprinter = 0;
  1319. Xchar    *fonts[100];
  1320. Xchar    *slots[10];
  1321. Xint        nfonts=0;
  1322. Xint        nslots=0;
  1323. Xvoid    trim();
  1324. X
  1325. Xmain (argc,argv)
  1326. Xint     argc;
  1327. Xchar    *argv[];
  1328. X{
  1329. X    char    *fname;
  1330. X    FILE    *fp_in, *fp_out;
  1331. X    int        i, j;
  1332. X    char    *c;
  1333. X    char    outname[100], fnonly[50];
  1334. X    char    *destdir;
  1335. X    
  1336. X    if (argc < 3)
  1337. X        usage ();
  1338. X
  1339. X    argc--;
  1340. X    destdir = argv[argc];
  1341. X    if (isdir (destdir) != 1)
  1342. X        usage ();
  1343. X
  1344. X    for (i = 1;  i < argc;  i++)
  1345. X    {    if ((fp_in = fopen (argv[i], "r")) != NULL)
  1346. X        {
  1347. X            for (j = 0;  j < nprinter;  j++)
  1348. X                printer[j] = pblank;
  1349. X            
  1350. X            for (j = 0;  j < nfonts;  j++)
  1351. X                free (fonts[j]);
  1352. X            
  1353. X            for (j = 0;  j < nslots;  j++)
  1354. X                free (slots[j]);
  1355. X            
  1356. X            nfonts = nslots = nprinter = 0;
  1357. X
  1358. X            fnameonly (argv[i], fnonly);
  1359. X            if ((c = strchr(fnonly, '.')))
  1360. X                *c = '\0';
  1361. X            strcpy (outname,destdir);
  1362. X            strcat (outname, "/");
  1363. X            strcat (outname, fnonly);
  1364. X            strcat (outname, ".def");
  1365. X
  1366. X            if ((fp_out = fopen (outname, "w")) == NULL)
  1367. X            {    fprintf (stderr, "%s: cannot create file %s\n", argv[0], outname);
  1368. X                exit (1);
  1369. X            }
  1370. X            build (fp_in);
  1371. X            display (fp_out);
  1372. X            fclose (fp_out);
  1373. X
  1374. X            fclose (fp_in);
  1375. X        }
  1376. X    }
  1377. X        
  1378. X}
  1379. X
  1380. Xbuild (fp_in)
  1381. XFILE    *fp_in;
  1382. X{
  1383. X    char    s[1000];
  1384. X    int        n;
  1385. X    int        a, b, c, d;
  1386. X    char    which[500];
  1387. X
  1388. X    order.bydefault[0] = 0;
  1389. X    order.normal[0] = 0;
  1390. X    order.reverse[0] = 0;
  1391. X    
  1392. X    while (fgets (s, 999, fp_in) != NULL)
  1393. X    {    trim (s);
  1394. X    
  1395. X        if (strncmp (s, "*PageSize", 9) == 0)
  1396. X        {
  1397. X            n = ptype (s, which);
  1398. X            gettext (s, printer[n].set);
  1399. X        }
  1400. X        else if (strncmp (s, "*NickName:", 10) == 0)
  1401. X        {
  1402. X            gettext (s, nickname);
  1403. X        }
  1404. X        else if (strncmp (s, "*Font ", 6) == 0)
  1405. X        {
  1406. X            ftype (s);
  1407. X        }
  1408. X        else if (strncmp (s, "*DefaultOutputOrder:", 20) == 0)
  1409. X        {    strcpy (order.bydefault, s + 21);
  1410. X        }
  1411. X        else if (strncmp (s, "*OutputOrder Normal:", 20) == 0)
  1412. X        {
  1413. X            gettext (s, order.normal);
  1414. X        }
  1415. X        else if (strncmp (s, "*OutputOrder Reverse:", 21) == 0)
  1416. X        {
  1417. X            gettext (s, order.reverse);
  1418. X        }
  1419. X        else if (strncmp (s, "*PaperTray", 10) == 0)
  1420. X        {
  1421. X            n = ptype (s, which);
  1422. X            gettext (s, printer[n].tray);
  1423. X        }
  1424. X        else if (strncmp (s, "*InputSlot", 10) == 0)
  1425. X        {
  1426. X            getmultitext (fp_in, s, which);
  1427. X            if (*which)
  1428. X            {    slots[nslots] = malloc (strlen(which) + 2);
  1429. X                strcpy (slots[nslots], which);
  1430. X                nslots++;
  1431. X            }
  1432. X        }
  1433. X        else if (strncmp (s, "*ImageableArea", 14) == 0)
  1434. X        {
  1435. X            n = ptype (s, which);
  1436. X            sscanf (strchr (s, '"') + 1, "%d%d%d%d", &a, &b, &c, &d);
  1437. X            printer[n].lx = a;
  1438. X            printer[n].ly = b;
  1439. X            printer[n].ux = c;
  1440. X            printer[n].uy = d;
  1441. X        }
  1442. X        else if (strncmp (s, "*PaperDimension", 15) == 0)
  1443. X        {
  1444. X            n = ptype (s, which);
  1445. X            sscanf (strchr (s, '"') + 1, "%d %d", &a, &b);
  1446. X            printer[n].sx = a;
  1447. X            printer[n].sy = b;
  1448. X        }
  1449. X    }
  1450. X}
  1451. X
  1452. X
  1453. Xptype (s, which)
  1454. Xchar    *s, *which;
  1455. X{
  1456. X    char    *w, *ww;
  1457. X    int        i;
  1458. X
  1459. X    w = s;
  1460. X    while (*w++ != ' ')
  1461. X        ;
  1462. X    ww = which;
  1463. X    while (*w != ':')
  1464. X    {
  1465. X        if (*w == '/')
  1466. X        {
  1467. X
  1468. X            while (*w++ != ':')
  1469. X                ;
  1470. X            break;
  1471. X/*
  1472. X            ww = which;
  1473. X            w++;
  1474. X            continue;
  1475. X*/
  1476. X        }
  1477. X        if (*w == ' ')
  1478. X            *w = '-';
  1479. X        *ww++ = *w++;
  1480. X    }
  1481. X    *ww = '\0';
  1482. X    while (*w == ' ')
  1483. X        w++;
  1484. X/*
  1485. X    sscanf (s, "%*s%s", which);
  1486. X*/
  1487. X/*
  1488. X    w = which;
  1489. X    while (*w)
  1490. X    {    if (*w == ':')
  1491. X        {    *w = '\0';
  1492. X            break;
  1493. X        }
  1494. X        w++;
  1495. X    }
  1496. X*/
  1497. X    for (i = 0;  i < nprinter;  i++)
  1498. X    {    if (strcmp (which, printer[i].name) == 0)
  1499. X            return (i);
  1500. X    }
  1501. X    strcpy (printer[nprinter].name, which);
  1502. X    nprinter++;
  1503. X    return (nprinter - 1);
  1504. X}
  1505. X
  1506. Xftype (s)
  1507. Xchar    *s;
  1508. X{
  1509. X    char    *w, *ww;
  1510. X    char    which[100];
  1511. X    int        i;
  1512. X
  1513. X    w = s;
  1514. X    while (*w++ != ' ')
  1515. X        ;
  1516. X    ww = which;
  1517. X    while (*w != ':')
  1518. X    {
  1519. X        if (*w == ' ')
  1520. X            *w = '-';
  1521. X        *ww++ = *w++;
  1522. X    }
  1523. X    *ww = '\0';
  1524. X    while (*w == ' ')
  1525. X        w++;
  1526. X
  1527. X    if (strncmp (which, "Za", 2))
  1528. X    {    if (tscan (which, "Bold") >= 0   ||  tscan (which,"Italic") >= 0 
  1529. X            || tscan (which,"Obliq") >= 0)
  1530. X            return;
  1531. X    }
  1532. X    
  1533. X    fonts[nfonts] = malloc (strlen (which) + 1);
  1534. X    strcpy (fonts[nfonts++], which);
  1535. X    
  1536. X}
  1537. X
  1538. X
  1539. Xdisplay (fp_out)
  1540. XFILE    *fp_out;
  1541. X{
  1542. X    int        i;
  1543. X    
  1544. X    fprintf (fp_out, "*printer\n");
  1545. X    fprintf (fp_out, "%s\n", nickname);
  1546. X    fprintf (fp_out, "*paper %d\n", nprinter);
  1547. X    for (i = 0;  i < nprinter;  i++)
  1548. X    {
  1549. X        fprintf (fp_out, "%s\n%s\n", printer[i].name, printer[i].set);
  1550. X        fprintf (fp_out, "%5d %5d %5d %5d %5d %5d\n",
  1551. X            printer[i].sx, printer[i].sy,
  1552. X            printer[i].lx, printer[i].ly, printer[i].ux, printer[i].uy);
  1553. X
  1554. X/*        print the actual size of the image area 
  1555. X
  1556. X        printf ("%-20s %-20s %4d %4d\n", pname, printer[i].name,
  1557. X            printer[i].ux - printer[i].lx + 1,
  1558. X            printer[i].uy - printer[i].ly + 1);
  1559. X*/
  1560. X    }
  1561. X
  1562. X    
  1563. X    if (order.normal[0]  ||  order.reverse[0])
  1564. X        fprintf (fp_out, "*order 3\n");
  1565. X    else
  1566. X        fprintf (fp_out, "*order 1\n");
  1567. X    fprintf (fp_out, "%s\n", order.bydefault);
  1568. X    if (order.normal[0]  ||  order.reverse[0])
  1569. X    {    fprintf (fp_out, "%s\n", order.normal);
  1570. X        fprintf (fp_out, "%s\n", order.reverse);
  1571. X    }
  1572. X    fprintf (fp_out, "*fonts %d\n", nfonts);
  1573. X    for (i = 0;  i < nfonts;  i++)
  1574. X        fprintf (fp_out, "%s\n", fonts[i]);
  1575. X
  1576. X    fprintf (fp_out, "*slots %d\n", nslots);
  1577. X    for (i = 0;  i < nslots;  i++)
  1578. X        fprintf (fp_out, "%s\n", slots[i]);
  1579. X    fprintf (fp_out, "*eof\n");
  1580. X}
  1581. X
  1582. Xgettext (s, t)
  1583. Xchar    *s, *t;
  1584. X{
  1585. X    strcpy (t, strchr (s, '"') + 1);
  1586. X    while (*t)
  1587. X    {    if (*t == '"')
  1588. X        {    *t = '\0';
  1589. X            break;
  1590. X        }
  1591. X        t++;
  1592. X    }
  1593. X}
  1594. X
  1595. Xgetmultitext (fp, s, t)
  1596. XFILE    *fp;
  1597. Xchar    *s, *t;
  1598. X{    int    eos;
  1599. X    char    xlin[500], *c;
  1600. X
  1601. X    eos = 0;
  1602. X    c = strchr (s, '"');
  1603. X    if (c == NULL)
  1604. X    {    *t = 0;
  1605. X        return;
  1606. X    }
  1607. X    strcpy (t, c + 1);
  1608. X    while (eos == 0)
  1609. X    {    while (*t)
  1610. X        {    if (*t == '"')
  1611. X            {    *t = '\0';
  1612. X                eos = 1;
  1613. X                break;
  1614. X            }
  1615. X            t++;
  1616. X        }
  1617. X        if (eos == 0)
  1618. X        {    fgets (xlin, 499, fp);
  1619. X            trim (xlin);
  1620. X            c = xlin;
  1621. X            while (isspace (*c))
  1622. X                c++;
  1623. X            if (strlen (t))
  1624. X                strcat (t, " ");
  1625. X            strcat (t, c);
  1626. X        }
  1627. X    }
  1628. X}
  1629. X
  1630. Xtscan (s, t)
  1631. Xchar     s[], t[];
  1632. X{
  1633. X    int    i, j, k;
  1634. X    for (i = 0;  s[i] != '\0';  i++)
  1635. X    {    for (j = i, k=0;  t[k] != '\0'  &&  s[j] == t[k];  j++, k++)
  1636. X            ;
  1637. X        if (t[k] == '\0')
  1638. X            return (i);
  1639. X    }
  1640. X    return (-1);
  1641. X}
  1642. X
  1643. Xvoid trim (s)                    /*    trim trailing blanks  and \n */
  1644. Xchar    *s;
  1645. X{    int many;
  1646. X
  1647. X    for (many = strlen (s) - 1;  many >= 0;  many--)
  1648. X    {    if (isgraph (s[many]))
  1649. X            break;
  1650. X        else
  1651. X            s[many] = '\0';
  1652. X    }
  1653. X}
  1654. X
  1655. X
  1656. X
  1657. Xfnameonly (path, fn)
  1658. Xchar    *path, *fn;
  1659. X{
  1660. X    char    *strrchr(), *where;
  1661. X    
  1662. X    if ((where = strrchr (path, '/')) == NULL)
  1663. X        strcpy (fn, path);
  1664. X    else
  1665. X        strcpy (fn, where + 1);
  1666. X    return;
  1667. X}
  1668. X
  1669. X
  1670. X/****************************************************************************
  1671. X*    isdir (name)                                                            *
  1672. X*    See if the 'name' is a directory entry.  If so, return 1.  If not,        *
  1673. X*    return a 0.                                                                *
  1674. X****************************************************************************/
  1675. X
  1676. Xisdir (name)
  1677. Xchar    *name;
  1678. X{
  1679. X    struct stat buf;
  1680. X
  1681. X    if (stat (name, &buf) != 0)                /* ensure stat() is happy        */
  1682. X        return (-1);
  1683. X    if ((buf.st_mode & S_IFMT) == S_IFDIR)     /* good call, see if             */
  1684. X        return (1);                            /*        is directory            */
  1685. X    if ((buf.st_mode & S_IFMT) == S_IFREG)     /* good call, see if            */
  1686. X        return (0);                            /*        is file                    */
  1687. X    return (-1);                            /* something else                */
  1688. X}
  1689. X
  1690. Xusage ()
  1691. X{    fprintf (stderr, "Usage: table f.ppd f.ppd ... /dest.dir\n");
  1692. X    fprintf (stderr, "   where   f.ppd    = source .ppd files\n");
  1693. X    fprintf (stderr, "           dest.dir = desination directory for .def files\n");
  1694. X    exit (1);
  1695. X}            
  1696. X    
  1697. END_OF_FILE
  1698. if test 9590 -ne `wc -c <'table.c'`; then
  1699.     echo shar: \"'table.c'\" unpacked with wrong size!
  1700. fi
  1701. # end of 'table.c'
  1702. fi
  1703. echo shar: End of archive 6 \(of 9\).
  1704. cp /dev/null ark6isdone
  1705. MISSING=""
  1706. for I in 1 2 3 4 5 6 7 8 9 ; do
  1707.     if test ! -f ark${I}isdone ; then
  1708.     MISSING="${MISSING} ${I}"
  1709.     fi
  1710. done
  1711. if test "${MISSING}" = "" ; then
  1712.     echo You have unpacked all 9 archives.
  1713.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1714. else
  1715.     echo You still need to unpack the following archives:
  1716.     echo "        " ${MISSING}
  1717. fi
  1718. ##  End of shell archive.
  1719. exit 0
  1720.  
  1721. exit 0 # Just in case...
  1722.